#ifndef JINGZIQI_SIMULATOR_HPP
#define JINGZIQI_SIMULATOR_HPP

#include "config.hpp"

#include "Game.hpp"
#include "serial.hpp"
#include <opencv2/core/types.hpp>
#include <opencv2/opencv.hpp>
#include <vector>

class JingZiqiSimulator {
public:
  JingZiqiSimulator();
  ~JingZiqiSimulator();

  // 启动游戏窗口
  void start_game();
  void game_on_going(cv::Mat &img);

  // 手动输入坐标下棋
  bool make_move(int row, int col, chessPiece piece = chessPiece::NONE);

  // 获取当前棋盘状态
  std::vector<std::vector<chessPiece>> get_board_state() const;

  // 重置游戏
  void reset_game();

  // 检查位置是否有效
  bool is_valid_position(int row, int col) const;

  // 获取当前玩家
  chessPiece get_current_player() const;

  // 检查游戏是否结束
  bool is_game_ended() const;

  // 获取获胜者
  chessPiece get_winner() const;

  std::array<chessPiece, 9> ai_input;
  std::array<chessPiece, 9> player_input;

  // private:
  std::shared_ptr<serial> sr_;
  std::shared_ptr<Game> chess_;
  static const int WINDOW_SIZE = 600;                   // 窗口大小
  static const int GRID_SIZE = 3;                       // 3x3网格
  static const int CELL_SIZE = WINDOW_SIZE / GRID_SIZE; // 每个格子的大小

  std::vector<std::vector<chessPiece>> board_state; // 棋盘状态
  chessPiece current_player;                        // 当前玩家
  cv::Mat canvas;                                   // 画布
  bool game_ended;                                  // 游戏是否结束
  chessPiece winner;                                // 获胜者

  // AI相关成员
  bool is_vs_computer;       // 是否为人机对战
  bool is_player_first;      // 玩家是否先手
  chessPiece player_piece;   // 玩家的棋子类型
  chessPiece computer_piece; // 电脑的棋子类型

  // AI相关函数
  bool is_board_full() const;              // 检查棋盘是否已满
  bool has_winner(chessPiece piece) const; // 检查指定棋子是否获胜
  bool is_draw() const;                    // 检查是否平局
  int minimax(std::vector<std::vector<chessPiece>> &board,
              bool is_maximizing);     // Minimax算法
  std::pair<int, int> get_best_move(); // 获取AI的最佳移动
  void computer_move();                // 执行AI移动
  void set_game_mode(bool vs_computer,
                     bool player_first = true); // 设置游戏模式

  // 鼠标回调函数的静态包装
  static JingZiqiSimulator *instance;
  // static void mouse_callback_wrapper(int event, int x, int y, int flags,
  //                                    void *userdata);

  // 鼠标点击处理
  void handle_mouse_click(int x, int y);

  // 绘制棋盘
  void draw_board();

  // 绘制棋子
  void draw_piece(int row, int col, chessPiece piece);

  // 绘制网格线
  void draw_grid();

  // 检查获胜条件
  chessPiece check_winner() const;

  // 切换玩家
  void switch_player();

  // 显示游戏结果
  void show_game_result();
  bool before_wrong;
};

#endif // JINGZIQI_SIMULATOR_HPP
